#pragma once

#include "../utility/Noncopyable.h"

class InetAddress;

class Socket : Noncopyable
{
public:
    explicit Socket(int sockFd);
    ~Socket();

    int getFd() const;

    void bindAddr(const InetAddress &localAddr);
    void listen();
    int accept(InetAddress *peerAddr);

    void shutdownWrite(); // 半关闭

    // Nagle算法优化TCP网络传输，缓存小数据包再一起发送
    // 减少网络中的小数据包数量，提高网络传输效率并降低拥塞
    // true-开启no delay-禁用算法
    void setTcpNoDelay(bool on);
    // 可以用于需要重启并绑定到相同端口的服务器
    void setReuseAddr(bool on);
    // 同一主机上的多个套接字绑定到相同的端口号
    // 可以用于在多个线程或进程之间负载均衡传入连接
    void setReusePort(bool on);
    // 长连接+心跳包
    void setKeepAlive(bool on);

private:
    const int sockFd_;
};
